#ifndef _MYSQL_UTIL_H_
#define _MYSQL_UTIL_H_
#include <iostream>
#include <string>
#include <vector>
#include <cstring>
#include <ctime>
#include <mysql/mysql.h>
#define MAX_SQL_LENTH 300

using namespace std;

void initialize();      // 在main函数的最开始调用
void closeDB();         // 在main函数的最后调用
bool initDB(const string& host, const string& user, const string& passwd, const string& db_name, const int port = 3306);
bool startTrans();
bool execQuery(const string& query, string* msg = NULL);
bool commitTrans();


/*********提供给打卡机系统的函数接口**************/
//#include "dakaji.h"
struct card_info
{
	string staff_id;
	string today;
	string punch_in_time;
	string punch_out_time;
	bool is_late;
	bool is_leave_early;
	bool is_miss;
	bool is_absenteeism;
	int work_time;
};

enum DateTimeFormat {DATE=1, TIME, DATETIME};
string getNow(DateTimeFormat format);	//获得当前系统时间，格式有上面三种
void getNow(DateTimeFormat format, char ret[]);

bool insertPunchInTime(const string& id, const string& tm);		//上班时间入库，参数是打卡员工的id和上班时间，时间格式是DATETIME，插入成功返回true
bool isPunchIn(const string& id);								//判断某员工是否有打上班卡，参数是该员工的id，有打上班卡返回true
bool insertPunchOutTime(const string& id, const string& tm);	//下班时间入库
bool insertDailyCardInfo(const card_info& ci);					//其他打卡信息入库，参数是card_info结构体，结构体内可以没有上下班时间，但是必须要有员工id
//查询某员工在指定日期的打卡信息，参数用于存储查询结果的card_info结构体，ci中必须要有staff_id
//如果ci.today没有设定的话，那么默认查找今天的打卡信息
//返回true表示查询成功，false可能是没有对应信息，也可能是数据库错误
bool queryCardInfo(card_info& ci);


/***********提供给职员系统的函数接口**************/
//#include "hr.h"
enum sex
{
	male,
	female,
	none
};

enum workrank
{
	CEO = 1,
	Vice_President, 
	Department_manager, 
	Employee
};

struct staff {
	string id;
	string tel;
	string mail;
	string name;
	string ver_code;
	enum sex sex;
	int age;
	enum workrank rank;
	bool is_deleted;
};

bool insertStaff(const staff& s);
bool queryStaffById(const string& id, staff& s);
bool queryAllStaffs(string& msg, bool without_deleted = true);
bool deleteStaffById(const string& id);
//给定员工id，查询该员工本月的异常打卡信息
//返回值是异常卡的数量，为-1表示id异常，比如id为空，返回值为0表示异常打卡数量为0，或者没有该员工的打卡信息
int queryAbnormalCardInfo(const string& id, vector<card_info>& ret);
//补卡，参数ci必须要有staff_id和补卡的日期today
bool updateCardInfo(const card_info& ci);
bool sql_deduct_fixed(string id,float deduct); // writed by joker, wz add


/***********提供给项目系统的函数接口**************/
typedef struct Project_Team
{
    string team_id;
    string team_name;

	string project_name;//项目名称

	//vector<string> team_member_id;//团队成员ID
	int team_member_num; 
	float team_percent;//团队工作量系数，用于计算团队收益
	double team_earnings;//团队收益
}Pro_Team;

typedef struct Project_member
{
    string id;// wz 使用id检索数据库中的姓名等其它信息, 认为不需要建立staff *memeber
	string team_id; 
	float work_percent;//个人工作量系数
	double worker_earnings;//个人项目收益
}Pro_mem;

typedef struct Project_message
{
    /* Basic information of a project */
	string project_name;//项目名称
	double project_fund;//项目资金（即投资方给的钱）
	/* 周期制定 */
    string project_start_t;//项目开始时间（与其它系统公共时间结构体，本系统只需要年月日信息） wz: 修改为string类型
	string project_end_t;//项目结束时间（与其它系统公共时间结构体，本系统只需要年月日信息）
    int project_period;//项目周期（以天为单位的整数，跨度为月或年的项目周期也换算成天）
    
	vector <string> test_note_time;//项目测试验收节点时间 wz cut from Project_message struct


	int team_num;
	int node_num;
	string post_time;
    // vector<string> project_team_id;//团队名称
	// vector<bool> monitor_result;
	// vector<int> test_result;
	// vector<int> check_accep_result;
	
	int rejectionTimes;//验收不合格次数
	float coefficient;//项目整体收益系数
	string details;//项目结项结果说明
	double project_earnings;//项目收益(即项目最终获得的钱，不一定等于project_fund)
}Pro_M;


//立项及分工
void input_project_message(struct Project_message *prom);
//周期制定
void project_period_make(struct Project_message *prom);
//过程监控
void project_process_monitor(const string& node_time_now,const string& project_name);
//项目测试
void ProjectTest(const string& node_time_now,const string& project_name);
//项目验收
int ProjectCheck_Accept(const int test_result,int rejectionTimes,const string& node_time_now,const string& project_name);
//结项
void ProjectPost(struct Project_message *prom);
//计算收益
double earnings_calculate(double total_money,float coefficient);


//前期：建立项目
void project_set_up();
//中期：过程管理
void project_process_manage();
//后期 结项及收益管理
void project_post_earnings();

//项目管理系统入口函数
void project_manage_system();


//前期
bool query_all_staff_id(string& msg ,bool without_deleted );
bool insert_project_manage(const Project_message& s);
bool update_project_manage(const Project_message& s);
bool insert_project_team_develop(const Project_Team& s);
bool update_project_team_develop(const Project_Team& s);
bool insert_project_team(const Project_member& s );
bool insert_project_test(const string& project_name,const string&test_note_time);
//中期
bool query_rejectionTimes(const string& project_name,int &rejectionTimes );
bool query_test_result(const string& project_name,const string& test_note_time,int &test_result);
bool query_test_note_time(string& msg ,const string& project_name );
bool update_monitor_result(const string& project_name,const string&test_note_time, int monitor_result);
bool update_test_result(const string& project_name,const string& test_note_time,int test_result);
bool update_check_accep_result(const string& project_name,const string& test_note_time,int check_accep_result);
bool update_rejectionTimest(const string& project_name,int rejectionTimes );

//后期
bool query_project_message(const string& project_name, Project_message& s);
bool query_all_team_id(string& msg ,const string& project_name );
bool query_team_percent(Project_Team& s,const string& team_id,const string &project_name);
bool query_work_percent(const string& id,const string& team_id,float &work_precent);
bool update_projectpost(const Project_message& s);
bool update_project_earnings(const Project_message& s);
bool update_team_earnings(const Project_Team& s,const string& project_name);
bool update_worker_earnings(const Project_member& s,const string& team_id);
bool update_worker_earnings(const string & staff_id,const string& team_id, float worker_earnings);


/***********提供给财务系统的函数接口**************/
#include "fs.h"
bool sql_record_water(struct water &wr);
bool sql_show_water(struct water &wr);
bool sql_record_electricity(struct electricity &elty);
bool sql_show_electricity(struct electricity &elty);
bool sql_desk_register(struct desk &dk);
bool sql_desk_recycle(struct desk &dk);
bool sql_show_desk(struct desk &dk);
bool sql_chair_register(struct chair &cr);
bool sql_chair_recycle(struct chair &cr);
bool sql_show_chair(struct chair &cr);
bool sql_computer_register(struct computer &cmpr);
bool sql_computer_recycle(struct computer &cmpr);
bool sql_show_computer(struct computer &cmpr);
bool sql_printer_register(struct printer &pinr);
bool sql_printer_recycle(struct printer &pinr);
bool sql_show_printer(struct printer &pinr);

bool sql_input_minimum_fixed(struct salary &slry);
bool sql_input_bonus(struct salary &slry);
bool sql_get_bonus_fixed_min(struct salary &slry);
bool sql_get_performance(struct salary &slry);
bool sql_compu_salary(struct salary &slry);
bool sql_show_salary(struct salary &slry);
bool sql_get_performance(string  &id,float &p);

#endif